#include "marching.h"

Marching::Marching(int num_divx, int num_divy, int num_divz) : NUM_DIVISIONS_X(num_divx), NUM_DIVISIONS_Y(num_divy), NUM_DIVISIONS_Z(num_divz) {

	float step_size[3] = {(meta_gridMax[0] - meta_gridMin[0])/NUM_DIVISIONS_X, (meta_gridMax[1] - meta_gridMin[1])/(NUM_DIVISIONS_Y), (meta_gridMax[2] - meta_gridMin[2])/NUM_DIVISIONS_Z};

	int totalSize = (NUM_DIVISIONS_X + 1) * (NUM_DIVISIONS_Y + 1) * (NUM_DIVISIONS_Z) +
						(NUM_DIVISIONS_X + 1) * (NUM_DIVISIONS_Y) * (NUM_DIVISIONS_Z + 1) +
						(NUM_DIVISIONS_X) * (NUM_DIVISIONS_Y + 1) * (NUM_DIVISIONS_Z + 1);

	// TAKE NOTE THESE HAVE NOT BEEN * 3'ed
	INDEX_START_XY = 0;
	INDEX_START_XZ = ((NUM_DIVISIONS_X + 1) * (NUM_DIVISIONS_Y + 1) * (NUM_DIVISIONS_Z));
	INDEX_START_YZ = ((NUM_DIVISIONS_X + 1) * (NUM_DIVISIONS_Y + 1) * (NUM_DIVISIONS_Z) +
						(NUM_DIVISIONS_X + 1) * (NUM_DIVISIONS_Y) * (NUM_DIVISIONS_Z + 1));

	// hacks... hacks everywhere...
	VERTEX_ARRAY_XY = new GLfloat[totalSize * 3];
	VERTEX_NORMALS = new GLfloat[totalSize * 3];
	VERTEX_NUM_TRIANGLES = new int[totalSize];

	// assign middlemen...
	VERTEX_ARRAY_XZ = &VERTEX_ARRAY_XY[((NUM_DIVISIONS_X + 1) * (NUM_DIVISIONS_Y + 1) * (NUM_DIVISIONS_Z)) * 3];
	VERTEX_ARRAY_YZ = &VERTEX_ARRAY_XY[((NUM_DIVISIONS_X + 1) * (NUM_DIVISIONS_Y + 1) * (NUM_DIVISIONS_Z) +
										(NUM_DIVISIONS_X + 1) * (NUM_DIVISIONS_Y) * (NUM_DIVISIONS_Z + 1)) * 3];

	// Create 3 dimensions array using vector (stores T/F)
	for (int x = 0; x <= num_divx; x++) {
		meta_grid.push_back(vector<vector<bool> >());
		for (int y = 0; y <= num_divy; y++) {
			meta_grid[x].push_back(vector<bool>());
			for (int z = 0; z <= num_divz; z++) {
				meta_grid[x][y].push_back(false);
			}
		}
	}

	// Load vertex array XY
	for (int x = 0; x <= num_divx; x++)
		for (int y = 0; y <= num_divy; y++) 
			for (int z = 0; z < num_divz; z++) {
				VERTEX_ARRAY_XY[(x * (NUM_DIVISIONS_Y + 1) * (NUM_DIVISIONS_Z) + y * NUM_DIVISIONS_Z + z) * 3 + 0] = (float)x * step_size[0] + meta_gridMin[0]; 
				VERTEX_ARRAY_XY[(x * (NUM_DIVISIONS_Y + 1) * (NUM_DIVISIONS_Z) + y * NUM_DIVISIONS_Z + z) * 3 + 1] = (float)y * step_size[1] + meta_gridMin[1]; 
				VERTEX_ARRAY_XY[(x * (NUM_DIVISIONS_Y + 1) * (NUM_DIVISIONS_Z) + y * NUM_DIVISIONS_Z + z) * 3 + 2] = ((float)z + 0.5f) * step_size[2] + meta_gridMin[2]; 
			}

	// Load vertex array XZ
	for (int x = 0; x <= num_divx; x++)
		for (int y = 0; y < num_divy; y++) 
			for (int z = 0; z <= num_divz; z++) {
				VERTEX_ARRAY_XZ[(x * (NUM_DIVISIONS_Z + 1) * (NUM_DIVISIONS_Y) + z * NUM_DIVISIONS_Y + y) * 3 + 0] = (float)x * step_size[0] + meta_gridMin[0]; 
				VERTEX_ARRAY_XZ[(x * (NUM_DIVISIONS_Z + 1) * (NUM_DIVISIONS_Y) + z * NUM_DIVISIONS_Y + y) * 3 + 1] = ((float)y + 0.5f) * step_size[1] + meta_gridMin[1]; 
				VERTEX_ARRAY_XZ[(x * (NUM_DIVISIONS_Z + 1) * (NUM_DIVISIONS_Y) + z * NUM_DIVISIONS_Y + y) * 3 + 2] = (float)z * step_size[2] + meta_gridMin[2]; 
			}

	// Load vertex array YZ
	for (int x = 0; x < num_divx; x++)
		for (int y = 0; y <= num_divy; y++) 
			for (int z = 0; z <= num_divz; z++) {
				VERTEX_ARRAY_YZ[(y * (NUM_DIVISIONS_Z + 1) * (NUM_DIVISIONS_X) + z * NUM_DIVISIONS_X + x) * 3 + 0] = ((float)x + 0.5f) * step_size[0] + meta_gridMin[0]; 
				VERTEX_ARRAY_YZ[(y * (NUM_DIVISIONS_Z + 1) * (NUM_DIVISIONS_X) + z * NUM_DIVISIONS_X + x) * 3 + 1] = (float)y * step_size[1] + meta_gridMin[1]; 
				VERTEX_ARRAY_YZ[(y * (NUM_DIVISIONS_Z + 1) * (NUM_DIVISIONS_X) + z * NUM_DIVISIONS_X + x) * 3 + 2] = (float)z * step_size[2] + meta_gridMin[2]; 
			}

	// initialize vertex normals
	for (int x = 0; x < totalSize*3; x++) {
		VERTEX_NORMALS[x] = 1.0f;
	}

	// initialize number of poly adj to each vertex
	for (int x = 0; x < totalSize; x++) {
		VERTEX_NUM_TRIANGLES[x] = 0;
	}
}

Marching::~Marching() {
	delete[] VERTEX_ARRAY_XY;
	delete[] VERTEX_NORMALS;
	delete[] VERTEX_NUM_TRIANGLES;
}

void Marching::Prepare() {

	// Do some precomputation for metaballs
	computeMetaGrid();
	computeTriangles();
}

// Draws all the triangles required
void Marching::Draw() 
{
   ModelerDrawState *mds = ModelerDrawState::Instance();

	_setupOpenGl();

    if (mds->m_rayFile)
    {
        _dump_current_modelview();
		/*
        fprintf(mds->m_rayFile, 
            "polymesh { points=((%f,%f,%f),(%f,%f,%f),(%f,%f,%f)); faces=((0,1,2));\n", x1, y1, z1, x2, y2, z2, x3, y3, z3 );
        _dump_current_material();
		*/
        fprintf(mds->m_rayFile, "})\n" );
    }
    else
    {
		
		/*
		glBegin( GL_TRIANGLES );

		for (int x = 0; x < meta_triangles.size(); x++) {
		// for (int x = 0; x < 10; x++) {

			// double x1 = meta_triangles[0][x][0], y1 = meta_triangles[0][x][1], z1 = meta_triangles[0][x][2];
			// double x2 = meta_triangles[1][x][0], y2 = meta_triangles[1][x][1], z2 = meta_triangles[1][x][2];
			// double x3 = meta_triangles[2][x][0], y3 = meta_triangles[2][x][1], z3 = meta_triangles[2][x][2];

			double x1 = VERTEX_ARRAY_XY[meta_triangles[x] * 3], y1 = VERTEX_ARRAY_XY[meta_triangles[x]  * 3 + 1], z1 = VERTEX_ARRAY_XY[meta_triangles[x]  * 3 + 2];
			x++;
			double x2 = VERTEX_ARRAY_XY[meta_triangles[x] * 3], y2 = VERTEX_ARRAY_XY[meta_triangles[x]  * 3 + 1], z2 = VERTEX_ARRAY_XY[meta_triangles[x]  * 3 + 2];
			x++;
			double x3 = VERTEX_ARRAY_XY[meta_triangles[x] * 3], y3 = VERTEX_ARRAY_XY[meta_triangles[x]  * 3 + 1], z3 = VERTEX_ARRAY_XY[meta_triangles[x]  * 3 + 2];
			
			double a, b, c, d, e, f;

			// the normal to the triangle is the cross product of two of its edges. 
			a = x2-x1;
			b = y2-y1;
			c = z2-z1;
        
			d = x3-x1;
			e = y3-y1;
			f = z3-z1;
        
			glNormal3d( b*f - c*e, c*d - a*f, a*e - b*d );
			glVertex3d( x1, y1, z1 );
			glVertex3d( x2, y2, z2 );
			glVertex3d( x3, y3, z3 );

		}

		glEnd();
		*/
		
		glEnableClientState(GL_VERTEX_ARRAY);
		glEnableClientState(GL_NORMAL_ARRAY);
		
		glVertexPointer(3, GL_FLOAT, 0, VERTEX_ARRAY_XY);
		glNormalPointer(GL_FLOAT, 0, VERTEX_NORMALS);
		glDrawElements(GL_TRIANGLES, meta_triangles.size(), GL_UNSIGNED_INT, &meta_triangles[0]);

		glDisableClientState(GL_NORMAL_ARRAY);
		glDisableClientState(GL_VERTEX_ARRAY);

    }
}



// Add a single metaball
void Marching::AddMetaball(float x, float y, float z, float mass) {
	metaballs.push_back(Vec4f(x, y, z, mass));
}

// Change the thereshold
void Marching::SetMetaThreshold(float thres) {
	META_THRESHOLD = thres;
}

// Change the power of a ball
void Marching::SetBallPower(int id, float power) {
	metaballs[id][3] = power;
}

void Marching::SetBallPosition(int id, Vec3f pos) {
	for (int x = 0; x < 3; x++)
		metaballs[id][x] = pos[x];
}


// Computes the grid of metaballs, to be used later for volume rendering
// That is, we determine whether each sample is "on" or "off" for each pixel
void Marching::computeMetaGrid() {
	float step_size[3] = {(meta_gridMax[0] - meta_gridMin[0])/NUM_DIVISIONS_X, (meta_gridMax[1] - meta_gridMin[1])/(NUM_DIVISIONS_Y), (meta_gridMax[2] - meta_gridMin[2])/NUM_DIVISIONS_Z};

	for (int x = 0; x <= NUM_DIVISIONS_X; x++) {
		for (int y = 0; y <= NUM_DIVISIONS_Y; y++) {
			for (int z = 0; z <= NUM_DIVISIONS_Z; z++) {

				// position we are testing.
				float xPos = x*step_size[0] + meta_gridMin[0];
				float yPos = y*step_size[1] + meta_gridMin[1];
				float zPos = z*step_size[2] + meta_gridMin[2];

				float sum = 0;

				Vec3f v_sample(x*step_size[0] + meta_gridMin[0], y*step_size[1] + meta_gridMin[1], z*step_size[2] + meta_gridMin[2]);

				// iterate through metaballs and sum the contribution for each metaball.
				// we assume that the contribution is propotional to the inverse of the square of the distance to the metaball
				for (int i = 0; i < metaballs.size(); i++) {			
					Vec3f v_ball(metaballs[i][0], metaballs[i][1], metaballs[i][2]);

					// distance to center of ball	
					float r2 = (v_ball - v_sample).length2();
					sum += metaballs[i][3] * 1/(r2);
				}

				if (sum <= META_THRESHOLD)
					meta_grid[x][y][z] = true;
				else
					meta_grid[x][y][z] = false;

			}
		}
	}
}

///////////////////////////////////////////////////////////////
// Messy and hardcoded STUFF
// - we follow the convention from: http://paulbourke.net/geometry/polygonise/
// - lookup table adapted from ^ as well
///////////////////////////////////////////////////////////////

// Call only after we get samples right
void Marching::computeTriangles() {

	meta_triangles.clear();

	// Marching freaking cubes... //
	// we have 12 edges which we may use.
	for (int x = 0; x < NUM_DIVISIONS_X; x++) {
		for (int y = 0; y < NUM_DIVISIONS_Y; y++) {
			for (int z = 0; z < NUM_DIVISIONS_Z; z++) {

				int corners = 0;

				if (meta_grid[x][y][z]) corners |= (1<<3);
				if (meta_grid[x+1][y][z]) corners |= (1<<2);
				if (meta_grid[x][y+1][z]) corners |= (1<<7);
				if (meta_grid[x][y][z+1]) corners |= (1<<0);
				if (meta_grid[x+1][y+1][z]) corners |= (1<<6);
				if (meta_grid[x+1][y][z+1]) corners |= (1<<1);
				if (meta_grid[x][y+1][z+1]) corners |= (1<<4);
				if (meta_grid[x+1][y+1][z+1]) corners |= (1<<5);

				AddTriangles(corners, x, y, z);

			}
		}
	}
}

// Triangulates accordingly, and adds triangles into the required vectors
// @param - corners contains the corner values.

// "corners" contains the bitmask (8 bit)
void Marching::AddTriangles(int corners, int x, int y, int z) {
	float step_size[3] = {(meta_gridMax[0] - meta_gridMin[0])/NUM_DIVISIONS_X, (meta_gridMax[1] - meta_gridMin[1])/(NUM_DIVISIONS_Y), (meta_gridMax[2] - meta_gridMin[2])/NUM_DIVISIONS_Z};

	int q = 0;
	for (int i = 0; i < 5; i++) {

		// no more triangles left to draw...
		if (marching_lookup[corners][q] < 0)
			break;

		// Compute the normal of this triangle...
		Vec3f p[3];
		for (int j = 0; j < 3; j++) {
			int edge_num = marching_lookup[corners][q+j];
			switch(edge_num) {
			case 0:
				p[j] = Vec3f(0.5, 0, 1);
				break;
			case 1:
				p[j] = Vec3f(1, 0, 0.5);
				break;
			case 2:
				p[j] = Vec3f(0.5, 0, 0);
				break;
			case 3:
				p[j] = Vec3f(0, 0, 0.5);
				break;
			case 4:
				p[j] = Vec3f(0.5, 1, 1);
				break;
			case 5:
				p[j] = Vec3f(1, 1, 0.5);
				break;
			case 6:
				p[j] = Vec3f(0.5, 1, 0);
				break;
			case 7:
				p[j] = Vec3f(0, 1, 0.5);
				break;
			case 8:
				p[j] = Vec3f(0, 0.5, 1);
				break;
			case 9:
				p[j] = Vec3f(1, 0.5, 1);
				break;
			case 10:
				p[j] = Vec3f(1, 0.5, 0);
				break;
			case 11:
				p[j] = Vec3f(0, 0.5, 0);
				break;
			}
		}

		Vec3f s1 = p[0] - p[1];
		Vec3f s2 = p[0] - p[2];
		Vec3f tri_norm(s1[1]*s2[2] - s1[2]*s2[1], -(s1[0]*s2[2] - s1[2]*s2[0]), s1[0]*s2[1] - s1[1]*s2[0]);

		// iterate through precomputed triangles (main part)
		for (int j = 0; j < 3; j++) {
			
			int edge_num = marching_lookup[corners][q];
			int base;
			// more or less hardcoded...
			switch(edge_num) {
			case 0: // YZ plane
				base = (y * (NUM_DIVISIONS_Z + 1) * (NUM_DIVISIONS_X) + (z + 1) * NUM_DIVISIONS_X + x) + INDEX_START_YZ;
				break;
			case 1: // XY plane 
				base = ((x+1) * (NUM_DIVISIONS_Y + 1) * (NUM_DIVISIONS_Z) + y * NUM_DIVISIONS_Z + z) + INDEX_START_XY;
				break;
			case 2: // YZ plane
				base = (y * (NUM_DIVISIONS_Z + 1) * (NUM_DIVISIONS_X) + z * NUM_DIVISIONS_X + x) + INDEX_START_YZ;
				break;
			case 3: // XY plane
				base = (x * (NUM_DIVISIONS_Y + 1) * (NUM_DIVISIONS_Z) + y * NUM_DIVISIONS_Z + z) + INDEX_START_XY;
				break;
			case 4: // YZ plane
				base = ((y+1) * (NUM_DIVISIONS_Z + 1) * (NUM_DIVISIONS_X) + (z+1) * NUM_DIVISIONS_X + x) + INDEX_START_YZ;
				break;
			case 5: // XY plane
				base = ((x+1) * (NUM_DIVISIONS_Y + 1) * (NUM_DIVISIONS_Z) + (y+1) * NUM_DIVISIONS_Z + z) + INDEX_START_XY;
				break;
			case 6: // YZ plane
				base = ((y+1) * (NUM_DIVISIONS_Z + 1) * (NUM_DIVISIONS_X) + z * NUM_DIVISIONS_X + x) + INDEX_START_YZ;
				break;
			case 7: // XY plane
				base = (x * (NUM_DIVISIONS_Y + 1) * (NUM_DIVISIONS_Z) + (y+1) * NUM_DIVISIONS_Z + z) + INDEX_START_XY;
				break;
			case 8: // XZ plane
				base = (x * (NUM_DIVISIONS_Z + 1) * (NUM_DIVISIONS_Y) + (z+1) * NUM_DIVISIONS_Y + y) + INDEX_START_XZ;
				break;
			case 9: // XZ plane
				base = ((x+1) * (NUM_DIVISIONS_Z + 1) * (NUM_DIVISIONS_Y) + (z+1) * NUM_DIVISIONS_Y + y) + INDEX_START_XZ;
				break;
			case 10: // XZ plane
				base = ((x+1) * (NUM_DIVISIONS_Z + 1) * (NUM_DIVISIONS_Y) + z * NUM_DIVISIONS_Y + y) + INDEX_START_XZ;
				break;
			case 11: // XZ plane
				base = (x * (NUM_DIVISIONS_Z + 1) * (NUM_DIVISIONS_Y) + z * NUM_DIVISIONS_Y + y) + INDEX_START_XZ;
				break;
			}

			//VERTEX_NORMALS[base * 3] = -1;
			//VERTEX_NORMALS[base * 3 + 1] = -1;
			//VERTEX_NORMALS[base * 3 + 2] = -1;

			float new_size = VERTEX_NUM_TRIANGLES[base]+1;
			VERTEX_NORMALS[base * 3] = ((VERTEX_NORMALS[base*3] * VERTEX_NUM_TRIANGLES[base]) + tri_norm[0])/new_size;
			VERTEX_NORMALS[base * 3 + 1] = ((VERTEX_NORMALS[base*3+1] * VERTEX_NUM_TRIANGLES[base]) + tri_norm[1])/new_size;
			VERTEX_NORMALS[base * 3 + 2] = ((VERTEX_NORMALS[base*3+2] * VERTEX_NUM_TRIANGLES[base]) + tri_norm[2])/new_size;
			VERTEX_NUM_TRIANGLES[base]++;

			meta_triangles.push_back(base);

			// increment overall counter...
			q++;
		}
	}

}

const float Marching::meta_gridMin[3] = {-2, -2, -2};
const float Marching::meta_gridMax[3] = {2, 2, 2};

/////
// Lookup table - EXTRACTED FROM http://paulbourke.net/geometry/polygonise/
// THIS LOOKUP TABLE is NOT done by us, although the rest of the code is!
/////
const int Marching::marching_lookup[256][16] =
{{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1},
{3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1},
{3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1},
{3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1},
{9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1},
{9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1},
{2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1},
{8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1},
{9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1},
{4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1},
{3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1},
{1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1},
{4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1},
{4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1},
{5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1},
{2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1},
{9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1},
{0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1},
{2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1},
{10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1},
{4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1},
{5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1},
{5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1},
{9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1},
{0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1},
{1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1},
{10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1},
{8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1},
{2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1},
{7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1},
{2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1},
{11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1},
{5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1},
{11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1},
{11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1},
{1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1},
{9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1},
{5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1},
{2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1},
{5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1},
{6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1},
{3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1},
{6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1},
{5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1},
{1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1},
{10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1},
{6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1},
{8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1},
{7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1},
{3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1},
{5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1},
{0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1},
{9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1},
{8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1},
{5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1},
{0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1},
{6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1},
{10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1},
{10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1},
{8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1},
{1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1},
{0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1},
{10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1},
{3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1},
{6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1},
{9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1},
{8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1},
{3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1},
{6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1},
{0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1},
{10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1},
{10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1},
{2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1},
{7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1},
{7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1},
{2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1},
{1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1},
{11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1},
{8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1},
{0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1},
{7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1},
{10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1},
{2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1},
{6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1},
{7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1},
{2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1},
{1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1},
{10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1},
{10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1},
{0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1},
{7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1},
{6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1},
{8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1},
{9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1},
{6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1},
{4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1},
{10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1},
{8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1},
{0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1},
{1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1},
{8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1},
{10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1},
{4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1},
{10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1},
{5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1},
{11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1},
{9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1},
{6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1},
{7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1},
{3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1},
{7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1},
{3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1},
{6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1},
{9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1},
{1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1},
{4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1},
{7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1},
{6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1},
{3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1},
{0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1},
{6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1},
{0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1},
{11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1},
{6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1},
{5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1},
{9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1},
{1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1},
{1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1},
{10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1},
{0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1},
{5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1},
{10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1},
{11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1},
{9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1},
{7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1},
{2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1},
{8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1},
{9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1},
{9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1},
{1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1},
{9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1},
{9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1},
{5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1},
{0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1},
{10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1},
{2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1},
{0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1},
{0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1},
{9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1},
{5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1},
{3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1},
{5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1},
{8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1},
{0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1},
{9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1},
{1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1},
{3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1},
{4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1},
{9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1},
{11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1},
{11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1},
{2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1},
{9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1},
{3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1},
{1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1},
{4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1},
{4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1},
{3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1},
{0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1},
{9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1},
{1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}};

